# 需求：
# 有两个参数：手机号和密码
# 手机号的测试数据有三个，密码的测试数据也有三个
# 最后组装成元组列表类型的数据作为最终的测试数据: [(手机号1,密码1),(手机号2,密码2),...]
# 总共需要几种场景的测试数据
phone_list = ['13880001111', '13999992222', '150999933331']
password_list = ['123456', '456def', 'aaaaaa']
# 目标：得到一个元组列表类型的数据
# 定义空列表
result = []
# 1.遍历手机号
for i in phone_list:
# 变量对应的密码
    for j in password_list:
# 账号和密码的全组合
        element = (i,j)
# print(element)
        result.append(element)
# 打印result
print(result)
# 计算有几种场景需要覆盖
print(len(result))



# 列表推导式：Python中构造列表数据的一种简洁方法
# 语法1：[表达式 for 变量 in 可迭代对象]
# 案例：从1~10中获取每个整数的平方，保存到列表中
# 方式1：for循环
res1 = []
for i in range(1,11):
    res1.append(i**2)
print(res1)
# 方式2：列表推导式
res2 = [i**2 for i in range(1,11)]
print(res2)

# 语法2：[表达式 for 变量 in 可迭代对象 if 条件判断]
# 案例：从1~10中获取每个整数偶数的平方，保存到列表中
res3 = [i ** 2 for i in range(1, 11) if i % 2 == 0]
print(res3)
# 语法3：[表达式 for 变量 in 可迭代对象 for 变量 in 可迭代对象]
result1 = [(i, j) for i in phone_list for j in password_list]
print(result1)

# 函数使用
# 定义函数：封装独立的功能
# 语法格式
# 注意事项
# def 是define的缩写，函数名尽量见名知义
# 函数命名规则遵循标识符命名规范【下划线命名习惯】
# 调用函数：享受封装后的成果
# 语法格式
# 函数名()
# 注意事项
# 只定义函数，不调用函数，函数不执行
# 调用函数不能放在定义函数的上方（顺序执行规则）
# 1.定义函数demo
def demo():
    """测试函数"""
    print("这个是测试函数")

    # 需求:
    # 1、定义字典存储测试数据，包含账号和密码提示：[[“username”："13488888888”，“password”："
    # 123456”）,
    # 【“username”：""，"password”："
    # 123456”}]
    # 2、遍历数据进行测试账号和密码校验
    # 3、当手机号为”13488888888”且密码为“123456”时，输出“登录成功”；否则“错误或密码错误”。

# 定义字典(非空)元素的列表
login_data = [
    {"username": "13488888888", "password": "123456"},
    {"username": "", "password": "123456"},
    {"username": "13800000001", "password": ""},
    {"username": "13800000001", "password": "123"}
]
# 1.先实现业务功能（函数）
def login(phone, pwd):
    """
    登录判断函数
    :param phone: 手机号
    :param pwd: 密码
    :return: 无
    """
    if phone == "13488888888" and pwd == "123456":
        print("登录成功")
    else:
        print("登录失败")

# 2.2再构造数据进行验证
num = 1 # 计数器
for i in login_data:
    # 获取账号密码
    phone = i.get("username")
    pwd = i.get("password")
    print(f"第{num}次测试")
    # 调用函数
    login(phone, pwd)
    num += 1 # 调用一次计数器增1

# 3.5 函数的返回值
# 注意事项
# return关键字可以将函数定义内部的任意数据返回给函数调用处
# return关键字也可以单独使用，表示提前结束函数调用，不返回任何结果(None)
# return关键词语句下方如果还有代码，那么后面的代码就不执行
# 定义函数
def login(phone):
    """
    模拟登录
    :param phone: 验证手机号
    :return: 返回账号的结果
    """
# 模拟登录
    if phone == "13488888888":
        return "账号正确"
    else:
        return "账号错误"
    # 调用函数
a = login("13800000001")
print(a) # 想看结果就直接打印出来
print(login("13488888888"))
# 调用函数断言结果
assert "账号错误" == login("13800000001")  # 预期结果 == 实际结果
assert "正确" in login("13488888888")  # 预期结果 in 实际结果
# 断言：通过工具/代码代替人自动判断结果
# 需求：设计一个函数用于获取两个数中的较大数，数据来自于函数的参数，最后返回较大值
# 1.定义函数
def get_max(num1, num2):
    # 有两个数字：直接通过参数传递
    # 判断大小关系
    if num1 > num2:
        # 返回较大值
        return num1
    else:
        return num2
    # 2.调用函数
num = get_max(10, 20)
print(num)
print(get_max(10, 20))
